home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <dos.h>
- #include <fcntl.h>
- #include <ctype.h>
- #include "scr.h"
- #define NROWS 24
- #define BAD -1
- #define GOOD 1
- #define NCOLS 80
- #define true 1
- #define false 0
- #define rom_call 0x10
- #define HILIT_ON 8
- #define BLINK 128 /* may be 176 */
- #define REVERSE 0x70
- #define NORMAL 7
- #define HIGHLIGHT 15
- #define BHIGHLIGHT 184
- #define UNDERLINE 1
- #define alpha 'A'
- #define ucase 'U'
- #define numeric 'N'
- #define floatting 'F'
- #define date 'D'
- #define telephone 'T'
- #define invisible 'I'
- #define soc_sec 'S'
- #define reg 'R'
- #define nothing 0
- #define dec_point 229 /* representation of decimal point */
- #define clear() (wclear(stdscr))
- #define move(c, c1) (wmove(stdscr, c, c1))
- #define delch() (wdelch(stdscr))
- #define deleteln() (wdeleteln(stdscr))
- #define addch(c) (waddch(stdscr, c))
- #define clrtoeol() (wclrtoeol(stdscr))
- #define clrtobot() (wclrtobot(stdscr))
- #define insertln() (winsertln(stdscr))
- #define insch(c) (winsch(stdscr, c))
- #define inch() (winch(stdscr))
- #define standout() (wstandout(stdscr))
- #define standend() (wstandend(stdscr))
- #define scroll() (wscroll(stdscr))
- #define echo() (0)
- #define noecho() (0)
- #define nl() (0)
- #define nonl() (0)
- #define addstr(c) (waddstr(stdscr, c))
- #define refresh() (wrefresh(stdscr))
- #define mvprint(r, c, s) move(r,c); addstr(s); refresh()
- #define mvclear(r, c) move(r, c); clrtoeol(); refresh()
-
- char *malloc(), *scr_buff, *strcat(), *strupr(), *strchr();
- char *lf = "\n", *lf_cr = "\n\r";
-
- int nkey, key_code[100][5], retrace = true;
- int page_size, line_size, user_page, printer;
- int mcv();
-
- typedef struct win_struct {
- int row_org, col_org;
- int row_max, col_max;
- int row, col;
- int first_row, first_col;
- int last_row, last_col;
- int first_pos, last_pos;
- int char_pos; /* current char position */
- char *buff; /* current buffer */
- int no_change;
- int buff_len; /* total buffer lenght */
- int attrib; /* atrribute */
- int scroll_fl; /* scroll flag */
- int box_flag; /* box flag */
- struct win_struct *next;
- } Window;
-
- Window *stdscr, *firstw = 0;
- Window *curr_wind;
-
- typedef struct Inkey_type {
- int flen; /* field lenght */
- char *recipient; /*the receiving the chars */
- int displ_flag; /* display flag */
- int ret_val;
- int char_flag; /* to be upper or lower case or numeric */
- Window *win;
- } Inkey_type;
-
-
-
- struct formatted {
- int frow,fcol;
- int flen;
- int nature; /* alpha, ucase,numeric,flotting */
- int decimal; /* number of decimal point */
- };
-
- double atof();
-
-
-
- double getdouble();
- long getlong();
- typedef long val_t, uval_t;
- char *convert(), *uconvert();
-
- static char *buff;
-
- static double round[] = {
- 0.5e+0,
- 0.5e-1,
- 0.5e-2,
- 0.5e-3,
- 0.5e-4,
- 0.5e-5,
- 0.5e-6,
- 0.5e-7,
- 0.5e-8,
- 0.5e-9,
- 0.5e-10,
- 0.5e-11,
- 0.5e-12,
- 0.5e-13,
- 0.5e-14,
- 0.5e-15,
- 0.5e-16,
- };
-
-
- last_update(win)
- Window *win;
- { int i, j;
- if (win->first_pos == -1 || win->char_pos < win->first_pos) {
- win->first_row = win->row;
- win->first_col = win->col;
- win->first_pos = (win->row * win->col_max + win-> col) * 2;
- }
- if (win->last_pos == -1 || win->last_pos < win->char_pos) {
- win->last_row = win->row;
- win->last_col = win->col;
- win->last_pos = (win->row * win->col_max + win->col) * 2;
- }
- win->no_change = false;
- }
-
-
-
- Window * newwin(org_row, org_col, nrow, ncol)
- int org_row, org_col, ncol, nrow;
- { Window *wd;
- char *pt, *pt1;
- int i, j;
- if (org_row < 0 || org_row > 24 || org_col < 0 || org_col > 80 ) return (0);
- if (nrow < 0 || nrow + org_row > 24 || ncol < 0 || ncol + org_col > 80)
- return(0);
- if (!(wd = (Window *) malloc(sizeof(Window)))) return(0);
- wd->buff_len = nrow * ncol * 2;
- if (!(wd->buff = malloc(wd->buff_len))) {
- free((char *) wd);
- return(0); /* no more free space */
- }
- wd->row_max = nrow;
- wd->col_max = ncol;
- wd->row_org = org_row;
- wd->col_org = org_col;
- wd->attrib = NORMAL; /* normal */
- wd->char_pos = 0;
- wd->first_pos = wd->last_pos = wd->first_row = wd->last_row = -1;
- wd->no_change = true;
- wd->next = firstw;
- wd->scroll_fl = false;
- firstw = wd;
- wd->first_pos = wd->last_pos = wd->first_col = wd->last_col = -1;
- wd->first_pos = wd->last_pos = -1;
- wclear(wd);
- wd->char_pos = 0; wd->row = wd->col = 0;
- wd->first_pos = wd->last_pos = wd->first_row = wd->last_row = -1;
- wd->no_change = true;
- wd->box_flag = false;
- return(wd);
- }
-
-
-
- waddch(win, mchar)
- Window *win;
- int mchar; /* add char to window */
- { int i;
- if (!good_window(win))return;
- win->buff[win->char_pos +1] = win->attrib; /* store attribut */
- win->buff[win->char_pos] = mchar;
- last_update(win); /* update last char pos */
- }
-
-
- waddstr(win, str)
- Window *win;
- char *str;
- {
- add_string(win, str, 1); /* add string with current attribute */
- }
-
-
-
- wclear(win) /* clear window */
- Window *win;
- {
- if (! good_window(win)) return;
- clr_buff(win->buff, win->buff_len, ' ', NORMAL);
- wmove(win, win->row_max -1, win->col_max -1);
- last_update(win);
- wmove(win, 0, 0);
- last_update(win);
- }
-
-
- wclrtobot(win) /* clear to end of frame in window */
- Window *win;
- { int i, j;
- if (! good_window(win)) return;
- last_update(win);
- i = win->buff_len - win->char_pos;
- clr_buff((win->buff) + win->char_pos, i, ' ', NORMAL);
- i = win->row;
- j = win->col;
- wmove(win, win->row_max -1, win->col_max -1 );
- last_update(win);
- wmove(win, i, j);
- }
-
-
- wclrtoeol(win) /* clear to end of line on window */
- Window *win;
- { int i,j;
- if (!good_window(win)) return;
- last_update(win);
- i = (win->col_max - win->col) * 2;
- clr_buff((win->buff) + win->char_pos, i, ' ', NORMAL);
- i = win->col;
- wmove(win, win->row, win->col_max -1);
- last_update(win);
- wmove(win, win->row, i);
-
- }
-
-
- wdelch(win) /* delete char from window */
- Window *win;
- { int i, j;
- char *pt, *pt1;
- if (!(good_window(win))) return;
- last_update(win);
- i = (win->col_max - win->col -1) *2;
- pt = win->buff + win->char_pos;
- for (pt1 = pt +2 ; i > 0; *pt ++ = *pt1 ++, i--);
- *pt ++ = ' '; /* blank end of line */
- *pt = win->attrib;
- i = win->col;
- wmove(win, win->row, win->col_max -1);
- last_update(win);
- wmove(win, win->row, i);
- }
-
-
-
- wdeleteln(win) /* delete one line from the window */
- Window *win;
- { int i, j;
- char *pt, *pt1;
- if (! good_window(win)) return;
- i = (win->row_max - win->row - 1) * win->col_max * 2; /* # oc cols */
- pt = win->buff + win->row * win->col_max * 2;
- if (i ) {
- pt1 = pt + win->col_max * 2; /* we are going to move things backward */
- for (; i > 0; *pt ++ = *pt1 ++, i--);
- }
- i = win->row;
- clr_buff(pt, win->col_max * 2, ' ', win->attrib); /* clear last line */
- wmove(win, win->row_max -1, win->col_max -1);
- last_update(win);
- wmove(win, i, 0);
- last_update(win);
- }
-
-
- wexptab(win) /*expand tab in the window */
- Window *win;
- { int i;
- if (! good_window(win)) return;
- i = (win->col - win->col % 8) + 8;
- if (i >= win->col_max) i = win->col_max - 1;
- wmove(win, win->row, i);
- }
-
-
- winch(win) /* get one char from screen */
- Window *win;
- { char *pt;
- unsigned int i, j;
- if (! good_window(win)) return;
- pt = win->buff + win->char_pos;
- i = *pt + *(pt +1) * 256; /* pack char and attribute */
- return(i);
- }
-
-
-
- winsch(win, ch) /* insert a char */
- Window *win;
- int ch;
- { int i, j;
- char *pt, *pt1;
- if (! good_window(win)) return;
- last_update(win);
- i = (win->row +1) * win->col_max * 2 - 3;
- pt1 = win->buff + i; /* end of buffer - 1 char */
- pt = pt1 +2; /* end of buffer */
- i = (win->col_max - win->col -1) * 2;
- for (; i > 0; *pt -- = *pt1 --, i--); /* move backward */
- *pt -- = win->attrib; /* attribute */
- *pt = ch ; /* insert ch */
- i = win->col;
- wmove(win, win->row, win->col_max -1);
- last_update(win);
- wmove(win, win->row, i);
- }
-
-
- winsertln(win) /* insert a line in window */
- Window *win;
- { int i, j;
- char *pt, *pt1;
- if (! good_window(win)) return;
- wmove(win, win->row, 0);
- last_update(win);
- pt1 = win->buff + win->buff_len -1; /* end of buffer */
- pt = pt1 - win->col_max * 2; /* source to move */
- i = (win->row_max - win->row -1) * win->col_max *2; /* # of elems */
- for (; i > 0; i--, *pt1 -- = *pt --); /* move now */
- wclrtoeol(win);
- j = win->row;
- wmove(win, win->row_max -1, win->col_max -1);
- last_update(win);
- wmove(win, j, 0);
- }
-
-
-
- wmove(win, row, col)
- int row, col;
- Window *win;
- {
- if (!good_window(win)) return;
- win->row = row % win->row_max;
- win->col = col % win->col_max;
- win->char_pos = (win->row * win->col_max + win->col) * 2;
- }
-
-
- woverch(win, mchar)
- Window *win;
- int mchar;
- { if (! good_window(win)) return;
- win->buff[win->char_pos] = mchar;
- last_update(win);
- }
-
-
- woverstr(win, s) /* overlay string over some thing */
- Window *win;
- char *s;
- { /* add sgtring without changing the attribute */
- add_string(win, s, 0);
- }
-
-
-
- wprintf(fmt, args)
- char *fmt;
- unsigned args;
- { char s[200];
- buff = s;
- format(mcv, fmt, &args);
- *buff = 0;
- addstr(s);
- }
-
-
- wprintfw(win, fmt, args)
- Window * win;
- char *fmt;
- unsigned args;
- { char s[200];
- buff = s;
- format(mcv, fmt,&args);
- *buff = 0;
- waddstr(win, s);
- }
-
-
-
- mcv(c)
- { return(*buff ++ = c & 0xff); }
-
-
-
- wrefresh(win) /* refresh window */
- Window *win;
- { int colx, rowx, row, col, i, j, n, m;
- char *pt;
- if (! good_window(win)) return;
- if (win->no_change || win->first_pos == -1 || win->last_pos == -1) {
- locate(win->row + win->row_org, win->col + win->col_org);
- return;
- }
- m = win->col_max * 2;
- rowx = win->first_row + win->row_org;
- pt = win->first_pos + win->buff;
- col = win->first_col;
- i = win->last_pos - win->first_pos + 2; /* total number of char to send */
- for (row = win->first_row; i > 0 && row <= win->last_row; rowx ++, row ++) {
- colx = win->col_org + col;
- j = (win->col_max - col) * 2; /* compute number of chars to send */
- n = (j < i) ? j : i;
- loc_update(rowx, colx, pt, n/2);
- pt += n ;
- i -= n ;
- col = 0;
- }
- locate(win->row + win->row_org, col + win->col + win->col_org);
- set_nochange(win);
- }
-
-
-
-
- wscroll(win) /* scroll up */
- Window *win;
- { int i, j;
- char *pt, *pt1;
- if (! good_window(win)) return;
- u_scroll(win->row_org, win->col_org, win->row_org + win->row_max - 1,
- win->col_org + win->col_max - 1);
- memcpy(win->buff, win->buff + (i = win->col_max *2),
- (j = (win->row_max -1) * win->col_max * 2));
- clr_buff(win->buff + j, i, ' ', NORMAL);
- pt = win->buff; /* transfer window to screen pad */
- pt1 = scr_buff+(win->row_org * 80 + win->col_org)*2; /* offset into buffer */
- j = win->col_max * 2;
- for (i = 0 ; i < win->row_max; i++) {
- memcpy(pt1, pt, j); /* move one row of infow */
- pt1 += 80 * 2; /* next row on the screen */
- pt += j;
- }
- set_nochange(win);
- }
-
-
- wstandend(win) /* hilit end */
- Window *win;
- {
- if (! good_window(win)) return;
- win->attrib &= ~HILIT_ON; /* hilit off manifest constant */
- }
-
-
- wstandout(win)
- Window *win;
- {
- if (! good_window(win)) return;
- win->attrib |= HILIT_ON;
- }
-
-
-
- wsetattrib(win, atrb) /* set window attribute */
- Window *win;
- int atrb;
- { int i;
- if ( ! good_window(win)) return;
- win->attrib = atrb;
- }
-
-
- wusetattrib(win, atrb) /* unset attribute */
- Window *win;
- int atrb;
- {
- if (! good_window(win)) return;
- win->attrib = NORMAL;
- }
-
-
-
- scrollok(win, ok) /* scroll ok */
- Window *win;
- int ok;
- {
- if (! good_window(win)) return;
- win->scroll_fl = ok;
- }
-
-
-
- box(win)
- Window *win;
- { int i, j, row, col;
- char s[3];
- if (! good_window(win)) return(BAD);
- row = win->row_org - 1;
- col = win->col_org -1 ;
- s[1] = NORMAL;
- if (win->row_org == 0 || win->col_org == 0 || win->row_max == NROWS
- || win->col_max == NCOLS) return;
- col = win->col_org - 1;
- row = win->row_org -1;
- for (i = 0; i <= win->row_max +1; i++, row ++) {
- if (i == 0 ) {
- s[0] = 201; /* left corner */
- box_char(row, col, s);
- s[0] = 187; /* right corner */
- box_char(row, win->col_org + win->col_max, s);
- }
- if (i == win->row_max +1 || i == 0 ) {
- s[0] = 205;
- for (j = 1; j < win->col_max +1; j++)
- box_char(row, j + col, s);
- }
- if (i == win->row_max+1) {
- s[0] = 200; /* leeft down corner */
- box_char(row, col, s);
- s[0] = 188; /* right down corner */
- box_char(row, col + win->col_max + 1, s);
- }
- if ( i && i != win->row_max +1) {
- s[0] = 186;
- box_char(row, col, s);
- box_char(row, col+ win->col_max+1, s);
- }
- }
- win->box_flag = true;
- }
-
-
- box_char(row, col,s )
- int row, col;
- char *s;
- { char *p;
- p = scr_buff + (row * NCOLS + col) * 2;
- *p ++ = *s;
- *p = s[1];
- write_attrib(row, col, s);
- }
-
-
-
- delwin(win) /* get rid of a wondow */
- Window *win;
- { Window *wd, *wd1;
- int done;
- if (! good_window(win)) return(BAD);
- if (win->box_flag) erase_box(win);
- wclear(win);
- wrefresh(win);
- free(win->buff);
- for (wd = wd1 = firstw, done = false; ! done; ) {
- if (wd == win) done = true;
- else {
- wd1 = wd;
- wd = wd->next;
- }
- }
- wd1->next = wd->next;
- if (wd == firstw) firstw = wd->next;
- free((char *) win);
- return(GOOD);
- }
-
-
-
- erase_box(win)
- Window *win;
- { int i, j, row, col;
- char s[3];
- if (! good_window(win)) return(BAD);
- row = win->row_org - 1;
- col = win->col_org -1 ;
- s[1] = NORMAL;
- s[0] = ' ';
- if (win->row_org == 0 || win->col_org == 0 || win->row_max == NROWS
- || win->col_max == NCOLS) return;
- col = win->col_org - 1;
- row = win->row_org -1;
- for (i = 0; i <= win->row_max +1; i++, row ++) {
- if (i == 0 ) {
- box_char(row, col, s);
- box_char(row, win->col_org + win->col_max, s);
- }
- if (i == win->row_max +1 || i == 0 ) {
- for (j = 1; j < win->col_max +1; j++)
- box_char(row, j + col, s);
- }
- if (i == win->row_max+1) {
- /* leeft down corner */
- box_char(row, col, s);
- /* right down corner */
- box_char(row, col + win->col_max + 1, s);
- }
- if ( i && i != win->row_max +1) {
- box_char(row, col, s);
- box_char(row, col+ win->col_max+1, s);
- }
- }
- }
-
-
- touch(win)
- Window *win;
- { int row, col, rowx, colx;
- if (! good_window(win)) return;
- win->first_row = win->first_col = win->first_pos = 0;
- win->last_row = win->row_max - 1;
- win->last_col = win->col_max - 1;
- win->last_pos = win->row_max * 2 * win->col_max;
- win->no_change = false;
- wrefresh(win);
- if (win->box_flag) box(win);
- }
-
-
- add_string(win, str, attrib_flag)
- Window *win;
- char *str;
- int attrib_flag;
- { int i, j;
- char *pt;
- if (! good_window(win)) return;
- pt = win->buff + win->char_pos;
- last_update(win);
- for ( i = win->col; *str && i < win->col_max; i ++, str ++) {
- *pt ++ = *str;
- if (attrib_flag) *pt ++ = win->attrib;
- else pt ++; /* add string conserving the attribute*/
- win->char_pos += 2;
- }
- j = win->col;
- if (i >= win->col_max) i = win->col_max -1 ;
- wmove(win, win->row, i);
- last_update(win);
- wmove(win, win->row, j); /* restore last cursor position */
- }
-
-
- clr_buff(s, len, c, attrib)
- int len, attrib;
- char *s, c;
- { int i, j;
- for (i = 0; i < len; i += 2) {
- *s ++ = c;
- *s ++ = attrib;
- }
- }
-
-
- good_window(win)
- Window *win;
- { int found;
- Window *fw;
- for (found = false, fw = firstw; !found && fw; fw = fw->next) {
- if (win == fw) {
- found = true;
- break;
- }
- }
- return(found);
- }
-
-
-
- loc_update(row, col, pt, len) /* update the location on the screen */
- int row, col, len;
- char *pt;
- { int i, j;
- char *pt1;
- struct SREGS sregs;
- i = (row * 80 + col) * 2;
- pt1 = scr_buff + i;
- if (retrace) {
- for (i = 0; i < len ; i++, col ++) {
- if (*pt != *pt1 || *(pt+1) != *(pt1 + 1)) {
- write_attrib(row, col, pt);
- *pt1 ++ = *pt ++; /* uptdate these locations */
- *pt1 ++ = *pt ++;
- }
- else {
- pt += 2;
- pt1 += 2;
- }
- }
- }
- else { /* move directly to screen if in an ibm */
- movedata(FP_SEG(pt), FP_OFF(pt), 0xb000, i, len * 2);
- memcpy(pt1, pt, len * 2); /* update memory too */
- }
- }
-
-
- noraw() /* raw mode set */
- { union REGS inreg, outreg;
- inreg.x.bx = 1; /* i/o control read request */
- inreg.x.ax = 0x4400;
- int86(0x21, &inreg, &outreg); /* i/o control read */
- inreg = outreg;
- inreg.h.dh = 0;
- inreg.h.dl &= ~ 0x20; /* set raw bit */
- inreg.x.bx = 1; /* i/o control write request */
- inreg.x.ax = 0x4401;
- int86(0x21, &inreg, &outreg);
- }
-
- raw() /* raw mode set */
- { union REGS inreg, outreg;
- inreg.x.bx = 1; /* i/o control read request */
- inreg.x.ax = 0x4400;
- int86(0x21, &inreg, &outreg); /* i/o control read */
- inreg = outreg;
- inreg.h.dh = 0;
- inreg.h.dl |= 0x20; /* set raw bit */
- inreg.x.bx = 1; /* i/o control write request */
- inreg.x.ax = 0x4401;
- int86(0x21, &inreg, &outreg);
- }
-
-
-
- set_nochange(win)
- Window *win;
- { win->no_change = true;
- win->first_row = win->last_row = win->first_col = win->last_col = -1;
- win->first_pos = win->last_pos = -1;
- }
-
-
- u_scroll(y0, x0, y3, x3) /* scroll up */
- int y0, x0, y3, x3;
- {
- do_scroll(y0, x0, y3, x3, 6);
- }
-
- d_scroll(y0, x0, y3, x3) /* down scroll */
- int y0, x0, y3, x3;
- {
- do_scroll(y0, x0, y3, x3, 7);
- }
-
-
- do_scroll(row0, col0, row3, col3, call_type) /* scroll up */
- int row0, col0, col3, row3, call_type;
- { union REGS inreg, outreg;
- inreg.h.ch = row0; /* set x0, y0 */
- inreg.h.cl = col0;
- inreg.h.dh = row3;
- inreg.h.dl = col3;
- inreg.h.bh = NORMAL;
- inreg.h.al = 1;
- inreg.h.ah = call_type; /* service code */
- int86(rom_call, &inreg, &outreg);
- }
-
- cursorsize(begl, endl)
- int begl,endl;
- { union REGS inreg, outreg;
- inreg.h.ah = 1; /* set cursor position */
- inreg.h.cl = endl;
- inreg.h.ch = begl;
- int86(rom_call, &inreg, &outreg);
- }
-
-
- /*** end of active routines */
-
-
- /* ##a */
-
-
- alinkey(nrow, ncol, message, len, s)
- int nrow, ncol, len;
- char *s, *message;
- { int i, j;
- char_clear(s, len, ' ');
- return(get_inkstring(stdscr, nrow, ncol, message, len, s));
- }
-
-
- /* ##b */
-
- bell()
- { putchar(7); }
-
- /* ##c */
-
-
-
- static char_clear(s, len, c)
- register char *s, c;
- register int len;
- {
- for (; len > 0 ; *s ++ = c, len--);
- *s = 0;
- }
-
-
- cls() /* clear screen */
- { union REGS inreg, outreg;
- inreg.x.ax = 0x7; /* set mode and clear screen */
- int86(rom_call, &inreg, &outreg);
- if (scr_buff != 0) clr_buff(scr_buff, 80 * 24 * 2, ' ', NORMAL);
- }
-
- cls_eol(row, col)
- int row, col;
- { int i, j;
- union REGS inreg, outreg;
- locate(row, col);
- if (! (inreg.x.cx = 80 - col)) return;
- inreg.x.bx = 0x7; /* normal mode*/
- inreg.h.ah = 9; /* service call */
- inreg.h.al = 32; /* char to used */
- int86(rom_call, &inreg, &outreg);
- }
-
-
-
- cls_eof(row, col) /* clear to end of screen */
- int row, col;
- { int i, j;
- union REGS inreg, outreg;
- locate(row, col);
- inreg.x.cx = (24 - row) * 80 - col;
- inreg.x.bx = 0x7; /* attributes */
- inreg.h.al = 32;
- inreg.h.ah = 9; /* service call */
- int86(rom_call, &inreg, &outreg);
- }
-
-
- concate(s, s1, s2)
- char *s, *s1, *s2;
- { strcpy(s, s1);
- strcat(s, s2);
- }
-
-
-
- /* ##d */
-
- doinput(curr_wind, finput, recip, ret_val)
- Window *curr_wind;
- int *ret_val;
- char *recip;
- struct formatted *finput;
- { char s[300], s1[300];
- int i, j;
- Window win;
- Inkey_type ink;
- double temp;
- if (finput->nature == numeric || finput->nature == floatting) {
- trim(s, recip); /* left justify numeric */
- lset(recip, s); /* do it now */
- ink.char_flag = (finput->decimal) ? numeric : floatting;
- }
- else ink.char_flag = finput->nature;
- ink.flen = finput->flen;
- ink.ret_val = *ret_val;
- win.next = firstw;
- firstw = &win; /* add tenmporary to list */
- set_winkey(curr_wind, &win, finput->frow, finput->fcol, finput->flen);
- ink.win = &win;
- ink.displ_flag = true;
- ink.recipient = recip;
- wmove(curr_wind, finput->frow, finput->fcol);
- win.attrib = ret_attrib(curr_wind); /* get attribute at location */
- zaskey(&ink);
- if (finput->nature == numeric || finput->nature == floatting) {
- temp = atof(recip);
- if (finput->decimal == 0) {
- sprintf(s1, "%%%dd", finput->flen);
- sprintf(s, s1, (int) temp);
- rset(recip, s);
- }
- else {
- sprintf(s1, "%%%d.%df", finput->flen, finput->decimal);
- sprintf(s, s1, temp);
- rset(recip, s);
- }
- wmove(&win, 0, 0);
- woverstr(&win, recip);
- wrefresh(&win);
- }
- *ret_val = ink.ret_val;
- firstw = win.next;
- }
-
-
- /* ##e */
-
-
- error_message(message)
- char *message;
- { bell();
- cls_eol(24, 0);
- cprintf("%s", message);
- kcget();
- cls_eol(24, 0);
- }
-
-
- /* ##f */
-
- fill_char(s, len, ch)
- char *s, ch;
- int len;
- { int i;
- for (i = 0; i ++ < len; *s ++ = ch);
- *s = 0;
- }
-
-
- filter(mchar)
- int mchar;
- { int i, j, cmc;
- if ((cmc = mchar) >= 32 && mchar <= 127) return(mchar);
- if (!cmc) {
- cmc = single_char();
- j = 2;
- }
- else j = 1;
- for (i= 0; i < nkey; ) {
- if (key_code[i][j] == cmc) {
- if (j == 4) return(key_code[i][0]);
- if ( !key_code[i][j+1]) return(key_code[i][0]);
- j ++; cmc = single_char();
- }
- else i++;
- }
- return(mchar);
- }
-
-
-
- /* ##g */
-
- get_inkstring(inwind, nrow, ncol, message, len, s)
- Window *inwind;
- int nrow, ncol, len;
- char *message, *s;
- { int i, j;
- Window win;
- Inkey_type ink;
- ink.char_flag = ucase;
- ink.ret_val = 0;
- wmove(inwind, nrow, ncol);
- wstandout(inwind);
- waddstr(inwind, message);
- wstandend(inwind);
- wrefresh(inwind);
- win.next = firstw;
- firstw = &win; /* add tenmporary to list */
- set_winkey(inwind, &win, nrow, ncol + strlen(message)+1, len);
- ink.displ_flag = true;
- ink.recipient = s;
- ink.win = &win;
- win.attrib = UNDERLINE;
- wmove(&win, 0, 0);
- waddstr(&win, s);
- zaskey(&ink);
- firstw = win.next; /* restore firstw */
- return(ink.ret_val);
- }
-
-
- /* ##i */
-
- inkey(finput, recip, ret_val)
- int *ret_val;
- char *recip;
- struct formatted *finput;
- {
- doinput(curr_wind, finput, recip, ret_val);
- }
-
-
-
-
- initscr()
- {
- if (! (stdscr = newwin(0, 0, 24, 80))) exit();
- cls();
- if ( !(scr_buff = malloc(80 *24 * 2))) {
- fprintf(stderr, "Out of memory\n");
- exit();
- }
- memcpy(scr_buff, stdscr->buff, 80*24*2);
- curr_wind = stdscr; /* set current window to stdscr */
- /* touch(stdscr); */
- }
-
-
- instring(s, s1)
- register char *s1, *s;
- { register char *p;
- register i, j;
- for (i = strlen(s), j = strlen(s1), p = s; i >= j; p++, i--) {
- if (!strncmp(p, s1, j)) return((int) (p -s));
- }
- return(-1);
- }
-
- /* ##k */
-
- kcget()
- {
- return(filter(single_char() & 0xff));
- }
-
-
-
- kcinit() /* init the keyboard filter */
- { FILE *fd, *fopen();
- char line[90], s[50], *getenv();
- int n, i;
- concate(s, "/terminal/", getenv("KEYB"));
- if (!(fd = fopen(s, "r"))) {
- fprintf(stderr, "Cannot open the keyboad configuration file %s\n", s);
- exit();
- }
- n = fileno(fd);
- setmode(n, O_TEXT); /* make sure we are in text mode */
- for ( nkey = 0; fgets(line, 80, fd); nkey ++) {
- sscanf(line, "%d %d %d %d %d", &key_code[nkey][0], &key_code[nkey][1],
- &key_code[nkey][2], &key_code[nkey][3], &key_code[nkey][4]);
- }
- fclose(fd);
- retrace = atoi(getenv("RETRACE"));
- open_printer();
- line_size = 80;
- user_page = 20;
- page_size = 24;
- }
-
-
- key_punched()
- { union REGS inreg, outreg;
- inreg.h.ah = 0x0b;
- intdos(&inreg, &outreg);
- return(outreg.h.al);
- }
-
-
- /* ##l */
-
- left_trim(s, s1) /* trim leading blanks */
- register char *s1, *s;
- { int i, j;
- for (; *s1 && *s1 == ' '; s1 ++); /* found first non blk */
- strcpy(s, s1); /* copy remainder to s */
- }
-
-
- locate(row, col)
- int row, col;
- { union REGS inreg, outreg;
- inreg.h.bh = 0; /* page number */
- inreg.h.dh = row;
- inreg.h.dl = col;
- inreg.h.ah = 2; /* service number */
- int86(rom_call, &inreg, &outreg);
- }
-
-
- lset(s, s1)
- char *s1, *s;
- { fill_char(s, strlen(s), ' ');
- left_trim(s1, s1);
- for (; *s && *s1; *s ++ = *s1 ++);
- }
-
-
- /* ##n */
-
- ninkey(nrow, ncol, message, len)
- int nrow, ncol, len;
- char *message;
- { Inkey_type ink;
- char s[200];
- Window win, *inwind;
- int i;
- inwind = stdscr;
- ink.displ_flag = false;
- ink.ret_val = 0;
- ink.char_flag = numeric;
- ink.recipient = s;
- char_clear(s, len, ' ');
- wstandout(inwind);
- wmove(inwind, nrow, ncol);
- waddstr(inwind, message);
- wstandend(inwind);
- wrefresh(inwind);
- win.next = firstw;
- firstw = &win;
- set_winkey(inwind, &win, nrow, ncol + strlen(message) +1, len);
- ink.win = &win;
- win.attrib = UNDERLINE;
- zaskey(&ink);
- firstw = win.next; /* reset firsw to its previous value */
- return(atoi(s));
- }
-
- /* ##o */
-
-
-
- one_char() /* get achar from key */
- {
- return(kcget());
- }
-
-
- open_printer()
- { printer = fileno(stdprn);
- setmode(printer, O_BINARY);
- }
-
- /* ##p */
-
- print_at(row, col, s)
- int row, col;
- char *s;
- { if (row < 24) {
- mvprint(row, col, s);
- }
- else {
- locate(row, col);
- cprintf("%s", s);
- }
- }
-
-
- /* ##r */
-
- ret_attrib(win)
- Window *win;
- { return(win->buff[win->char_pos+1]);
- }
-
-
- right_trim(s, s1)
- char *s;
- register char *s1;
- { register int i, j;
- i = strlen(s1) - 1;
- for (; i >= 0 && s1[i] == ' '; i--);
- if (i < 0) *s = 0;
- else {
- s1[i+1] = 0;
- strcpy(s, s1);
- }
- }
-
-
- rset(s, s1)
- char *s, *s1;
- { int i, j;
- trim(s1, s1);
- fill_char(s, (i = strlen(s)), ' ');
- j = strlen(s1) - 1;
- for ( i--; i >= 0 && j >= 0; s[i --] = s1[j--]);
- }
-
-
- /* ##s */
-
-
- set_winkey(inwind, win, nrow, ncol, len)
- Window *inwind, *win;
- int nrow, ncol, len;
- { int i;
- win->row_org = inwind->row_org + nrow;
- win->col_org = inwind->col_org + ncol;
- win->col_max = len;
- win->row_max = 1;
- i = (nrow * inwind->col_max + ncol) * 2;
- win->buff = inwind->buff + i;
- wmove(win, 0, 0);
- win->attrib = inwind->attrib;
- set_nochange(win);
- }
-
-
- single_char() /* just read one single char */
- { union REGS inreg, outreg;
- inreg.h.ah = 8; /* bdos call for input char */
- inreg.x.dx = inreg.x.cx = 0;
- intdos(&inreg, &outreg);
- return(outreg.h.al & 0xff);
- }
-
-
- space(s)
- char *s;
- { for (; *s && *s == ' '; s++);
- return ( (*s) ? false : true) ;
- }
-
-
- /* ##t */
-
-
- trim(s, s1)
- char *s, *s1;
- { left_trim(s, s1);
- right_trim(s, s);
- }
-
-
- /* ##w */
-
-
- write_attrib(row, col, pt)
- int row, col;
- char *pt;
- { union REGS inreg, outreg;
- locate(row, col);
- inreg.h.bh = 0; /* page one */
- inreg.h.al = *pt ++ ; /* char to write */
- inreg.h.bl = *pt; /* atrribute */
- inreg.x.cx = 1; /* number of chars */
- inreg.h.ah = 9; /* rom call service number */
- int86(rom_call, &inreg, &outreg);
- }
-
-
- winkey(win, finput, recip, ret_val)
- int *ret_val;
- Window *win;
- char *recip;
- struct formatted *finput;
- {
- doinput(win, finput, recip, ret_val);
- }
-
- /* ##z */
-
- zaskey(ink)
- Inkey_type *ink;
- { int c, done, used, i, ins_flag, store_flag;
- char *p, *s ;
- ins_flag = false;
- wmove(ink->win, 0, 0);
- if (ink->displ_flag) woverstr(ink->win, ink->recipient);
- else {
- for (i = 0, c = ' '; i < ink->win->col_max; i++) {
- wmove(ink->win, 0, i);
- woverch(ink->win, c);
- }
- }
- wrefresh(ink->win);
- for (used = 0, done = false; ! done; ) {
- wmove(ink->win, 0, used);
- wrefresh(ink->win);
- switch((c = kcget())) {
- case BACKSPACE :
- case LEFT : if (used > 0) used --;
- break;
- case RIGHT : if (used < ink->win->col_max - 1) used ++;
- else if (ink->ret_val == -1) {
- ink->ret_val = RIGHT;
- done = true;
- }
- break;
- case ESC :
- case UP :
- case DOWN :
- case F10 :
- case 13 : done = true;
- ink->ret_val = c;
- break;
- case INSERT : ins_flag = ins_flag ? false : true;
- break;
- case DELETE : wdelch(ink->win);
- break;
- default : store_flag = false;
- c &= 0xff;
- if (isascii(c) || c == '.') {
- if (ink->char_flag == numeric ||
- ink->char_flag == floatting) {
- if (c == '-' || c == '+' || isdigit(c)
- || c == '.' || c == ' ') {
- store_flag = true;
- /* if (c == '.' && ink->char_flag !=floatting)
- store_flag = false; */
- }
- }
- else {
- if (ink->char_flag == ucase) c = toupper(c);
- store_flag = true;
- }
- }
- if (store_flag) {
- if (ins_flag) {
- winsch(ink->win, c);
- }
- else woverch(ink->win, c);
- if (used < ink->win->col_max - 1) used ++;
- else if (ink->ret_val == -1) {
- ink->ret_val = 13;
- done = true;
- }
- }
- }
- }
- p = ink->win->buff;
- for (s = ink->recipient, i = 0; i < ink->win->col_max; i++) {
- *s ++ = *p ++;
- *p++; /* pass the attribute */
- }
- *s = 0;
- wrefresh(ink->win);
- }
-
-
- wprint_at(win, row, col, s)
- Window *win;
- int row, col;
- char *s;
- {
- wmove(win, row, col);
- waddstr(win, s);
- wrefresh(win);
- }
- /* **************************** FORNAT PROGRAM */
-
- format(putsub, fmt, args)
- register int (*putsub)(); register char *fmt; char *args;
- {
- register int c;
- int rj, fillc, *intarg;
- int maxwidth, width;
- val_t value;
- long *longarg;
- int i, k;
- unsigned *oldarg;
- char *cp, **ap;
- char s[400];
- double dval;
-
- while ( c = *fmt++ ) {
- if ( c == '%' ) {
- oldarg = args;
- s[14] = 0;
- rj = 1;
- fillc = ' ';
- maxwidth = 0x7fff;
- if ( (c = *fmt) == '-' ) {
- rj = 0;
- c = *fmt++;
- }
- if ( c == '0' )
- fillc = '0';
- if (c == '*') {
- width = getint(&args);
- c = *fmt++;
- } else {
- c = *fmt ++;
- for (width = 0 ; isdigit(c); c = *fmt++ )
- width = width*10 + c - '0';
- }
- if ( c == '.' ) {
- if ((c = *fmt++) == '*') {
- maxwidth = getint(&args);
- c = *fmt++;
- } else {
- for (maxwidth = 0 ; isdigit(c) ; c = *fmt++)
- maxwidth = maxwidth*10 + c - '0';
- }
- }
- if (c == 'l') {
- c = *fmt++;
- value = getlong(&args);
- } else if (c == 'd')
- value = getint(&args);
- else if (c == 'e' || c == 'f' || c == 'g')
- dval = getdouble(&args);
- else if (c != 's') value = getint(&args);
-
- switch ( c ) {
- case 'o':
- cp = uconvert(value, 8, s+14);
- break;
- case 'd':
- if ( value < 0 ) {
- cp = convert(-value, 10, s+14);
- *--cp = '-';
- } else
- cp = convert(value, 10, s+14);
- break;
- case 'u':
- cp = uconvert((val_t)(uval_t)value, 10, s+14);
- break;
- case 'x':
- cp = uconvert(value, 16, s+14);
- break;
- case 's':
- ap = (char * *) args;
- i = strlen(cp = *ap);
- args += sizeof(char *);
- goto havelen;
- case 'e':
- case 'f':
- ftoa(dval, s, maxwidth==0x7fff?6:maxwidth, c=='e'?0:1);
- i = strlen(cp = s);
- maxwidth = 400;
- goto havelen;
-
- case 'c':
- c = value;
- goto defcase;
-
- default:
- args = oldarg;
- defcase:
- *(cp = s+13) = c;
- break;
- }
-
- i = (s+14) - cp;
- havelen:
- if ( i > maxwidth )
- i = maxwidth;
-
- if ( rj ) {
- while ( width-- > i )
- (*putsub)(fillc);
- }
- for ( k = 0 ; *cp && k < maxwidth ; ++k )
- (*putsub)(*cp++);
-
- if ( !rj ) {
- while ( width-- > i )
- (*putsub)(' ');
- }
- } else
- (*putsub)(c);
- }
- }
-
- static char digits[]="0123456789abcdef";
-
- static char *
- convert(n, base, s)
- register int base; register char *s; register uval_t n;
- {
- do {
- *--s = digits[(int)(n%base)];
- } while ( (n /= base) != 0 );
- return s;
- }
-
- static char *
- uconvert(n, base, s)
- register int base; register char *s; long n;
- {
- register int t;
-
- if (n < 0) {
- t = (int)n&1;
- n = (n>>1)&0x7fffffff;
- *--s = digits[((int)(n%(base>>1))<<1)+t];
- n /= base>>1;
- }
- return convert(n,base,s);
- }
-
-
-
- ftoa(number, buffer, maxwidth, flag)
- double number; register char *buffer;
- {
- register int i;
- int exp, digit, decpos, ndig;
- int zero = 0, one = 1, ten = 10;
-
- ndig = maxwidth+1;
- if (number < zero) {
- number = -number;
- *buffer++ = '-';
- }
- exp = 0;
- if (number > 0.0) {
- while (number < one) {
- number *= ten;
- --exp;
- }
- while (number >= ten) {
- number /= ten;
- ++exp;
- }
- }
-
- if (flag)
- ndig += exp;
- if (ndig > 0) {
- if ((number += round[ndig>15?15:ndig-1]) >= 10.0) {
- number /= 10.0;
- ++exp;
- if (flag)
- ++ndig;
- }
- }
-
- if (flag) {
- if (exp < 0) {
- *buffer++ = '0';
- *buffer++ = '.';
- for (i = exp ; ++i < 0 && maxwidth ; --maxwidth)
- *buffer++ = '0';
- decpos = 0;
- } else {
- decpos = exp+1;
- maxwidth += exp+1;
- }
- } else {
- maxwidth++;
- decpos = 1;
- }
-
- while (maxwidth--) {
- digit = (int)number;
- *buffer++ = digit+'0';
- if (decpos && --decpos == 0)
- *buffer++ = '.';
- number = (number - digit) * ten;
- }
- if (decpos) {
- while (--decpos)
- *buffer++ = '0';
- *buffer++ = '.';
- }
-
- if (!flag) {
- *buffer++ = 'e';
- if (exp < 0) {
- *buffer++ = '-';
- exp = -exp;
- } else
- *buffer++ = '+';
- if (exp >= 100) {
- *buffer++ = exp/100 + '0';
- exp %= 100;
- }
- *buffer++ = exp/10 + '0';
- *buffer++ = exp%10 + '0';
- }
- *buffer = 0;
- }
-
- getint(s)
- char **s;
- { int *in;
- in = (int *) *s;
- (*s) += sizeof(int);
- return(*in);
- }
-
- long getlong(s)
- char **s;
- { long *lint;
- lint = (long *) *s;
- (*s) += sizeof(long);
- return(*lint);
- }
-
- double getdouble(s)
- char **s;
- { double *dval;
- dval = (double *) *s;
- (*s) += sizeof(double);
- return(*dval);
- }